package vista;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.io.File;
import javax.swing.JComboBox;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JToolBar;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JProgressBar;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.SwingConstants;
import javax.swing.BorderFactory;
import javax.swing.border.TitledBorder;
import temporizador.*;

import panelVisual.JPanelImagen;


public class VentanaPrincipal extends JFrame {
	
	
	private JLabel lblAhorcado,lblNivel;
	private JTextArea txtFrase;
	private JButton[] btnLetras;
	private JButton btnIniciarJuego;
	private JComboBox cbNivel;
	private LabelTemporizador lblTemporizador;
	private JProgressBar pgbVida;
	private ImageIcon[] imgAhorcado;
	private int indiceImagenAhorcado;
	private char caracterOcultar='*';
	
	private JPanel panelEstadoNivel;
	private JPanel panelPrincipalEstado;
	private JPanel panelEstadoTiempo;
	private JPanel panelEstadoVida;
	private JPanel panelInicial;
	private JPanel panelLetras;
	private JPanel panelFrase;
	private JPanelImagen panelAhorcado;
	
	
	
	private JMenuItem mJuegoNuevo,mPrimerasPuntuaciones,mAgregarFrase,mSalir;
	
	public VentanaPrincipal(){
			
		panelEstadoNivel= new JPanel();
		panelPrincipalEstado= new JPanel();
		panelEstadoTiempo= new JPanel();
		panelEstadoVida= new JPanel();
		panelInicial= new JPanel();
		panelLetras= new JPanel();
		panelFrase= new JPanel();
		
		JMenuBar barraMenu= new JMenuBar();
		JMenu mJuego= new JMenu("Juego");
		JMenu mAcciones= new JMenu("Acciones");
		
		mJuegoNuevo= new JMenuItem("Nuevo Juego");
		mPrimerasPuntuaciones= new JMenuItem("Primeras Puntuaciones");
		mAgregarFrase= new JMenuItem("Agregar Frase");
		mSalir= new JMenuItem("Salir");
		
		mJuego.add(mJuegoNuevo);
		mJuego.addSeparator();
		mJuego.add(mPrimerasPuntuaciones);
		mJuego.addSeparator();
		mJuego.add(mSalir);
		
		mAcciones.add(mAgregarFrase);
		
		barraMenu.add(mJuego);
		barraMenu.add(mAcciones);
		
		this.setJMenuBar(barraMenu);
		/************Area del Ahorcado***********/
		panelAhorcado= new JPanelImagen();
		indiceImagenAhorcado=0;
		imgAhorcado= new ImageIcon[9];
		cargarImagenesAhorcado();
		
		lblAhorcado= new JLabel();
		
		ImageIcon imgFondo= new ImageIcon(getClass().getResource("imagenes" + File.separator + "FondoPrincipal.jpg"));
		
		panelAhorcado.setImagen(imgFondo);
		
		panelAhorcado.add(lblAhorcado);
		lblAhorcado.setBounds(380, 190, 50, 100);
	
		panelAhorcado.add(panelPrincipalEstado);
		panelPrincipalEstado.setBounds(5, 10, 785, 50);
		
		
		/*****************************/
		

		/**********Area de Estado***************/
		
		lblNivel= new JLabel("BASICO");
		lblNivel.setForeground(Color.WHITE);
		
		panelEstadoNivel.add(lblNivel);
		
		
		lblTemporizador= new LabelTemporizador();
        lblTemporizador.setForeground(Color.WHITE);
		lblTemporizador.setFont(new Font(lblTemporizador.getFont().getName(),Font.BOLD,lblTemporizador.getFont().getSize()+8));
	    
		panelEstadoTiempo.add(lblTemporizador);
		
		pgbVida= new JProgressBar(0,8);
		
		
		panelEstadoVida.add(pgbVida);
	    
		
		panelPrincipalEstado.setLayout(new BorderLayout(3,0));
		
		panelPrincipalEstado.add(panelEstadoNivel,BorderLayout.LINE_START);
		panelPrincipalEstado.add(panelEstadoVida,BorderLayout.CENTER);
		panelPrincipalEstado.add(panelEstadoTiempo,BorderLayout.LINE_END);
	
		TitledBorder bordeEstadoNivel= BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.WHITE), "Nivel");
		TitledBorder bordeEstadoVida= BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.WHITE), "Vida");
		TitledBorder bordeEstadoTiempo= BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.WHITE), "Tiempo de Juego");
		
		
		bordeEstadoNivel.setTitleColor(Color.WHITE);
		bordeEstadoVida.setTitleColor(Color.WHITE);
		bordeEstadoTiempo.setTitleColor(Color.WHITE);
		
		bordeEstadoNivel.setTitleJustification(TitledBorder.CENTER);
		bordeEstadoVida.setTitleJustification(TitledBorder.CENTER);
		bordeEstadoTiempo.setTitleJustification(TitledBorder.CENTER);
		
		panelEstadoNivel.setBorder(bordeEstadoNivel);
		panelEstadoNivel.setOpaque(false);
		
		panelEstadoVida.setBorder(bordeEstadoVida);
		panelEstadoVida.setOpaque(false);
		
		panelEstadoTiempo.setBorder(bordeEstadoTiempo);
		panelEstadoTiempo.setOpaque(false);
		
		
		panelAhorcado.add(panelPrincipalEstado,BorderLayout.NORTH);
		panelPrincipalEstado.setOpaque(false);
		
		/**************************************/
		
		/*********Area Frase**************/
		panelFrase= new JPanel();
	    txtFrase= new JTextArea("");
	    
		txtFrase.setLineWrap(true);
	    txtFrase.setWrapStyleWord(true);
	    txtFrase.setForeground(Color.WHITE);
	    txtFrase.setFont(new Font(txtFrase.getFont().getName(),Font.BOLD,txtFrase.getFont().getSize()+5));
		
		
		txtFrase.setOpaque(false);
		txtFrase.setEditable(false);
		
		panelFrase.add(Box.createRigidArea(new Dimension(0,3)));
		panelFrase.add(txtFrase);
		
		
		panelFrase.setOpaque(false);
		
		panelAhorcado.add(panelFrase);
		panelFrase.setBounds(5, 320, 230, 210);
		/*********************************/
		
		
		/*********Area de Letras**************/
		panelLetras= new JPanel();
		panelLetras.setLayout(new GridLayout(3,9,5,7));
		
		inicializarBotones();
		
		for (int i=0; i < btnLetras.length;++i){
			panelLetras.add(btnLetras[i]);
		}
		
		
		panelAhorcado.add(panelLetras);
		panelLetras.setBounds(290, 320, 490, 170);
		panelLetras.setOpaque(false);
	
		
		/*************************************/
		
		/**********Vista Inicial*************/
		panelInicial= new JPanel();
		
		panelInicial.setLayout(null);
		
        btnIniciarJuego= new JButton("Iniciar Juego");
        cbNivel= new JComboBox();
		
        cbNivel.addItem("BASICO");
        cbNivel.addItem("INTERMEDIO");
        cbNivel.addItem("AVANZADO");
        
        panelInicial.add(cbNivel);
        cbNivel.setBounds(50, 30, 150, 30);
        panelInicial.add(btnIniciarJuego);
        btnIniciarJuego.setBounds(25,110,200,30);
		
		TitledBorder bordeVistaInicial= BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Elija Nivel");
		
		bordeVistaInicial.setTitleColor(Color.BLACK);
		bordeVistaInicial.setTitleJustification(TitledBorder.CENTER);
		
		panelInicial.setBorder(bordeVistaInicial);
		
	    panelInicial.setOpaque(false);
		
		panelAhorcado.add(panelInicial);
		panelInicial.setBounds(290, 130, 250, 150);
		/**************************************/
		
		
		setSize(800,570);
		add(panelAhorcado);
		
		
	}
	
	
	public void addListener(KeyListener listener){
		addKeyListener(listener);
		for (int i=0;i < btnLetras.length; ++i){
			btnLetras[i].addKeyListener(listener);
		}
		
	}
	
	public void addListener(ActionListener listener){
		btnIniciarJuego.addActionListener(listener);
		
		for (int i=0;i < btnLetras.length; ++i){
			btnLetras[i].addActionListener(listener);
		}
		
		mJuegoNuevo.addActionListener(listener);
		mPrimerasPuntuaciones.addActionListener(listener);
		mAgregarFrase.addActionListener(listener);
		mSalir.addActionListener(listener);
		
	}
	
	
	
	private void cargarImagenesAhorcado(){
		imgAhorcado[0]= null;
		imgAhorcado[1]= new ImageIcon(getClass().getResource("imagenes" + File.separator + "ah1.png"));
		imgAhorcado[2]= new ImageIcon(getClass().getResource("imagenes" + File.separator + "ah2.png"));
		imgAhorcado[3]= new ImageIcon(getClass().getResource("imagenes" + File.separator + "ah3.png"));
		imgAhorcado[4]= new ImageIcon(getClass().getResource("imagenes" + File.separator + "ah4.png"));
		imgAhorcado[5]= new ImageIcon(getClass().getResource("imagenes" + File.separator + "ah5.png"));
		imgAhorcado[6]= new ImageIcon(getClass().getResource("imagenes" + File.separator + "ah6.png"));
		imgAhorcado[7]= new ImageIcon(getClass().getResource("imagenes" + File.separator + "ah7.png"));
		imgAhorcado[8]= new ImageIcon(getClass().getResource("imagenes" + File.separator + "ah8.png"));
	}
	
	
	
	public LabelTemporizador getLabelTemporizador(){
		return lblTemporizador;
	}
	
	public String obtenerTiempo(){
		return lblTemporizador.getText();
	}
	
	
	public void iniciarPartida(){
		indiceImagenAhorcado=0;
		this.requestFocus();
		lblAhorcado.setIcon(imgAhorcado[indiceImagenAhorcado]);
		
		
		asignarVida(8);
		
		ocultarFrase();
	}
	
	public void asignarNivel(String nivel){
		lblNivel.setText(nivel.toUpperCase());
	}
	
	public String obtenerNivelLabel(){
		return lblNivel.getText();
	}
	
	public String obtenerNivelCombo(){
		return (String)cbNivel.getSelectedItem();
	}
	
	public int obtenerVida(){
		return pgbVida.getValue();
	}
	
	public int obtenerMaxVida(){
		return pgbVida.getMaximum();
	}
	
	public void decrementarVida(){		
		asignarVida(pgbVida.getValue() - 1);
		
		indiceImagenAhorcado= (indiceImagenAhorcado + 1) % imgAhorcado.length;
		lblAhorcado.setIcon(imgAhorcado[indiceImagenAhorcado]);
		
	}
	
    public void asignarVida(int valor){
    	
    	if (valor >= pgbVida.getMinimum() && valor <= pgbVida.getMaximum()){
    	   pgbVida.setValue(valor);
    	}
    	else if (valor < pgbVida.getMinimum()){
    	   pgbVida.setValue(pgbVida.getMinimum());
    	}
    	else if (valor > pgbVida.getMaximum()){
     	   pgbVida.setValue(pgbVida.getMaximum());
     	}
    	
    	actualizarColorEstado();
    }
    
    
    
    private void actualizarColorEstado(){
    	switch (pgbVida.getValue()){
    	   case 1:
    	   case 2:
    		   pgbVida.setForeground(Color.RED);
    		   break;
    	   case 3:
    	   case 4:
    		   pgbVida.setForeground(Color.ORANGE);
    		   break;
    	   case 5:
    	   case 6:
    		   pgbVida.setForeground(Color.YELLOW);
    		   break;
    	   default:	   
    		   pgbVida.setForeground(Color.GREEN);
    		   
    	}
    }
	
	public void asignarFrase(String frase){
		txtFrase.setText(frase.toUpperCase());
	}
	
	public void ocultarFrase(){
		String fraseOculta="";
		
		
		for (char caracter:txtFrase.getText().toCharArray()){
		   if (!Character.isSpaceChar(caracter)) 
			  fraseOculta += String.valueOf(caracterOcultar);
		   else
			   fraseOculta+=caracter;
		}
		
		txtFrase.setText(fraseOculta);
	}
	
	public void mostrarCaracter(String frase,char c){
        
		char[] fraseTextArray= txtFrase.getText().toCharArray();
		char[] fraseArray= frase.toCharArray();
        
        for (int i=0; i < fraseArray.length;++i){
        	if (fraseArray[i]==c){
        		fraseTextArray[i]=c;
        	}
        }
        
		txtFrase.setText(String.valueOf(fraseTextArray));
	}
	
	public void deshabilitarBoton(char letra){
		
		for (int i=0;i < btnLetras.length; ++i){
			if (btnLetras[i].getActionCommand().equals(String.valueOf(letra).toUpperCase())){
			   btnLetras[i].setEnabled(false);
			   btnLetras[i].setOpaque(true);
			   break;
			}
		}
	}
	
   public void habilitarBotones(){
		
		for (int i=0;i < btnLetras.length; ++i){
			   btnLetras[i].setEnabled(true);
			   btnLetras[i].setOpaque(false);
			
		}
	}
	
	public boolean isBotonHabilitado(char letra){
		boolean habilitado= false;
		
		for (int i=0;i < btnLetras.length; ++i){
			if (btnLetras[i].getActionCommand().equals(String.valueOf(letra).toUpperCase())){
			   habilitado=btnLetras[i].isEnabled();
			   break;
			}
		}
		
		return habilitado;
	}
	
	private void inicializarBotones(){
		btnLetras= new JButton[27];
		boolean agregado=false;
		
		for (int i=0,indiceCaracter=65; i < 27;++i,++indiceCaracter){
			if (i!=14)
			   btnLetras[i]= new JButton(String.valueOf(Character.toChars(indiceCaracter)));
			else if (!agregado){
				--indiceCaracter;
				btnLetras[i]= new JButton(String.valueOf(Character.toChars(209)));	//Para la Ñ
				agregado=true;
			}
			
			
		}
	}
	
	
	public void ocultarVistaJuego(){
	
		panelPrincipalEstado.setVisible(false);
		panelLetras.setVisible(false);
		panelFrase.setVisible(false);
		
		lblAhorcado.setIcon(imgAhorcado[0]);
		
		txtFrase.setText("");
		
	}
	
	
	public void mostrarVistaJuego(){
  
		panelPrincipalEstado.setVisible(true);
		panelLetras.setVisible(true);
		panelFrase.setVisible(true);
	     	
		iniciarPartida();
	}
	
	public void ocultarVistaInicial(){
		panelInicial.setVisible(false);
	}
	
	public void mostrarVistaInicial(){
		
		ocultarVistaJuego();
		
		panelInicial.setVisible(true);
		
		
	}
	
   
}
